
#include <algorithm>
#include <iostream>
#include <ostream>
struct TreeNode {
    int val;
    TreeNode *left;
    TreeNode *right;
    TreeNode() : val(0), left(nullptr), right(nullptr) {}
    TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
    TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
};

int res = 0;

// 前序遍历
// 每次调用递归函数的时候，都是处理二叉树的某个节点
// 二叉树的节点除了存储节点值之外，还可以存储其他属性值，比如这个节点的深度
// 这个节点所有的信息，都是以函数参数的方式，存储在对应的栈帧中
void preOrder(TreeNode *root, int depth) {
    // 最小子问题
    if (root == nullptr) return;
    res = std::max(res, depth);
    // 遍历左子树
    preOrder(root->left, depth + 1);
    // 遍历右子树
    preOrder(root->right, depth + 1);
}

// 后序遍历
// 计算以 node 为根节点的二叉树的最大深度
int postOrder(TreeNode *root) {
    // 最小子问题
    if (root == nullptr) return 0;
    // 遍历左子树
    int leftMaxDepth = postOrder(root->left);
    // 遍历右子树
    int rightMaxDepth = postOrder(root->right);
    return std::max(leftMaxDepth, rightMaxDepth) + 1;
}

int maxDepth(TreeNode *root) {
    // 最小子问题
    if (root == nullptr) return 0;
    // 遍历左子树
    int leftMaxDepth = maxDepth(root->left);
    // 遍历右子树
    int rightMaxDepth = maxDepth(root->right);
    return std::max(leftMaxDepth, rightMaxDepth) + 1;
}

int main() {
    TreeNode node5(7, nullptr, nullptr);
    TreeNode node4(11, nullptr, nullptr);
    TreeNode node3(23, nullptr, nullptr);
    TreeNode node2(9, nullptr, &node5);
    TreeNode node1(8, &node3, &node4);
    TreeNode root(10, &node1, &node2);

    preOrder(&root);

    return 0;
}

